ホームに戻る
関連 :
目次 :
DataContext とは
MVVMパターン における ViewModel を担うクラスで、View ( Window または UserControl )のプロパティとして設定する。
この DataContext を介して、View と ViewModel が接続される。
DataContext における重要な要素は以下の2つ。
- 変更通知プロパティ
- ViewModel のプロパティ変化を View に通知
- コマンド
- View の操作を ViewModel に通知
ユーザの操作はUI( View )に対して行われるが、UIに関する処理は ViewModel ( DataContext )で完結させるのがMVVMパターンにおける原則である。
(コードビハインドの記述を最小限に留める。通常、コードビハインドにはコンストラクタしか記述されない。)
ただし、コードビハインドでの処理が適する場合も存在する。
Visual Studioで Window や UserControl を作成した際、View (XAMLとコードビハインドの対)は作成されるが、ViewModel はいかなる場合も自動では作成されない(MVVMに準拠した構成とならない)。
(このため、コードビハインドが ViewModel だと誤解されることも多いが誤りである。)
変更通知プロパティやコマンドを含めた ViewModel の実装を自力で行うと記述が非常に煩雑となるが、
MVVM Toolkit等のライブラリを活用することでコードの記述を大幅に削減できる。
DataContext ( ViewModel )の実装
任意のクラスを ViewModel として新たに作成し、View の DataContext に指定する。
ViewModel の作成
ViewModel : MainViewModel.cs
namespace Sample
{
// ViewModel の本体
class MainViewModel
{
// プロパティ
public string Message { get; set; } = "サンプルメッセージ";
}
}
DataContext の指定
XAMLで行う場合
View : MainWindow.xaml
<
Window x:Class=
"BucketRelay.MainWindow"
xmlns=
"http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x=
"http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d=
"http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc=
"http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local=
"clr-namespace:BucketRelay"
mc:Ignorable=
"d"
d:DataContext=
"{d:DesignInstance Type=local:MainViewModel}" <!-- デザイナ上で MainViewModel を参照する際に指定 -->
(略)
>
<!-- MainViewModel を DataContext に設定 -->
<
Window.DataContext>
<
local:MainViewModel />
</
Window.DataContext>
:
<!-- TextBlock.Text を DataContext ( MainViewModel )の Message とバインド -->
<
TextBlock Text=
"{Binding Message}" />
ここでは MainViewModel を Window の DataContext として設定している。
Window のタグ中で d:DataContext の指定を併せて行っておくと、デザイナから ViewModel を参照でき、IntelliSenseの支援が受けられる。
注意が必要な点として、XAMLから DataContext の指定を行う場合、呼び出せる ViewModel のコンストラクタはデフォルトコンストラクタ(引数の無いコンストラクタ)に限定される。
このため、デフォルトコンストラクタ以外を呼びたい場合はコードビハインドで指定を行うなどの回避策をとる必要がある。
DataContext の指定を Window タグに含めることも可能である。
<
Window
(略)
DataContext=
"local:MainViewModel"
(略)
>
(略)
コードビハインドで行う場合
View : MainWindow.xaml.cs
namespace Sample
{
public partial class MainWindow : Window
{
// コンストラクタ
public MainWindow()
{
InitializeComponent();
this.DataContext = new MainViewModel();
}
}
}
DataContext の指定はコードビハインドから行うことも可能である(通常はXAMLから行うことが推奨される)。
その場合はコンストラクタ中で ViewModel のインスタンスを DataContext に代入する。
前述の通り ViewModel がデフォルトコンストラクタを持たない場合はXAMLからの指定ができないため、コードビハインドで行う。